/**
 * 直播销售系统时区处理模块
 * 解决海外用户的时区显示错误问题
 */
export class TimezoneHandler {
    constructor() {
        // 获取用户浏览器默认时区
        this.userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
        // 直播默认时区（假设为北京时间，即Asia/Shanghai）
        this.defaultTimezone = 'Asia/Shanghai';
        // 支持的时区列表
        this.supportedTimezones = [
            { id: 'Asia/Shanghai', name: '中国标准时间 (GMT+8)', offset: 8 },
            { id: 'America/New_York', name: '美国东部时间 (GMT-5)', offset: -5 },
            { id: 'Europe/London', name: '英国标准时间 (GMT+0)', offset: 0 },
            { id: 'Europe/Paris', name: '中欧时间 (GMT+1)', offset: 1 },
            { id: 'Australia/Sydney', name: '澳大利亚东部时间 (GMT+10)', offset: 10 },
            { id: 'Asia/Tokyo', name: '日本标准时间 (GMT+9)', offset: 9 },
            { id: 'Asia/Dubai', name: '迪拜时间 (GMT+4)', offset: 4 }
        ];
    }

    /**
     * 获取用户当前时区
     * @returns {string} 时区标识符，如 "Asia/Shanghai"
     */
    getUserTimezone() {
        return this.userTimezone;
    }

    /**
     * 获取支持的时区列表
     * @returns {Array} 时区列表
     */
    getSupportedTimezones() {
        return this.supportedTimezones;
    }

    /**
     * 设置直播默认时区
     * @param {string} timezone 时区标识符
     */
    setDefaultTimezone(timezone) {
        this.defaultTimezone = timezone;
    }

    /**
     * 将日期时间从一个时区转换到另一个时区
     * @param {Date|string} date 日期对象或日期字符串
     * @param {string} fromTimezone 源时区标识符
     * @param {string} toTimezone 目标时区标识符
     * @returns {Date} 转换后的日期对象
     */
    convertTimezone(date, fromTimezone, toTimezone) {
        if (typeof date === 'string') {
            date = new Date(date);
        }

        // 获取源时区的UTC时间
        const utcTime = date.getTime() - (date.getTimezoneOffset() * 60000);

        // 获取目标时区相对于UTC的偏移量
        const toTimezoneOffset = this.getTimezoneOffset(toTimezone);
        const fromTimezoneOffset = this.getTimezoneOffset(fromTimezone);

        // 计算目标时区的时间
        const targetTime = new Date(utcTime + (toTimezoneOffset - fromTimezoneOffset) * 3600000);

        return targetTime;
    }

    /**
     * 获取时区相对于UTC的偏移量（小时）
     * @param {string} timezone 时区标识符
     * @returns {number} 时区偏移量（小时）
     */
    getTimezoneOffset(timezone) {
        const zoneInfo = this.supportedTimezones.find(zone => zone.id === timezone);
        if (zoneInfo) {
            return zoneInfo.offset;
        }

        // 如果找不到指定时区，尝试使用Intl API获取偏移量
        try {
            const referenceDate = new Date();
            const targetTime = referenceDate.toLocaleString('en-US', { timeZone: timezone });
            const targetDate = new Date(targetTime);
            const offset = (targetDate.getTime() - referenceDate.getTime()) / (60 * 60 * 1000);
            return offset;
        } catch (error) {
            console.error('无法获取时区偏移量:', error);
            return 0; // 默认返回UTC+0
        }
    }

    /**
     * 格式化日期时间为本地字符串
     * @param {Date|string} date 日期对象或日期字符串
     * @param {string} [timezone] 时区标识符，默认为用户当前时区
     * @param {Object} [options] 格式化选项
     * @returns {string} 格式化后的日期时间字符串
     */
    formatDateTime(date, timezone = this.userTimezone, options = {}) {
        if (typeof date === 'string') {
            date = new Date(date);
        }

        // 如果提供了时区，先转换为该时区的时间
        if (timezone && timezone !== this.defaultTimezone) {
            date = this.convertTimezone(date, this.defaultTimezone, timezone);
        }

        // 默认格式化选项
        const defaultOptions = {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
            hour12: false
        };

        // 合并选项
        const formatOptions = { ...defaultOptions, ...options };

        // 格式化日期时间
        return new Intl.DateTimeFormat(undefined, formatOptions).format(date);
    }

    /**
     * 格式化直播开始时间
     * @param {Date|string} startTime 直播开始时间
     * @param {string} [timezone] 时区标识符，默认为用户当前时区
     * @returns {string} 格式化后的直播开始时间字符串
     */
    formatLiveStartTime(startTime, timezone = this.userTimezone) {
        const now = new Date();
        const startDate = typeof startTime === 'string' ? new Date(startTime) : startTime;

        // 如果提供了时区，先转换为该时区的时间
        if (timezone && timezone !== this.defaultTimezone) {
            startDate = this.convertTimezone(startDate, this.defaultTimezone, timezone);
        }

        // 计算时间差
        const timeDiff = startDate - now;
        const minutes = Math.floor(timeDiff / 60000);

        // 如果直播已开始
        if (timeDiff <= 0) {
            return '直播已开始';
        }

        // 如果直播将在1小时内开始
        if (minutes < 60) {
            return `即将开始 (${minutes}分钟后)`;
        }

        // 如果直播将在1天内开始
        if (minutes < 1440) {
            const hours = Math.floor(minutes / 60);
            const remainingMinutes = minutes % 60;
            return `今天 ${this.formatDateTime(startDate, timezone, { hour: '2-digit', minute: '2-digit' })}`;
        }

        // 如果直播将在1天后开始
        return this.formatDateTime(startDate, timezone, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });
    }

    /**
     * 计算两个时区之间的时差
     * @param {string} timezone1 第一个时区标识符
     * @param {string} timezone2 第二个时区标识符
     * @returns {number} 时差（小时）
     */
    getTimeDifference(timezone1, timezone2) {
        const offset1 = this.getTimezoneOffset(timezone1);
        const offset2 = this.getTimezoneOffset(timezone2);
        return offset2 - offset1;
    }
}

// 创建单例实例
export const timezoneHandler = new TimezoneHandler();    